import("//llvm/lib/Target/targets.gni")
import("//llvm/utils/gn/build/write_cmake_config.gni")

# In the CMake build, each plugin calls `add_lldb_library(name PLUGIN ...)`,
# which implicitly adds the plugin name to the LLDB_PLUGINS list.
# A few places then query that list and add dependencies on it.
# lldb/source/Plugins/CMakeList.txt then does string munging on the list of
# plugin names to generate Plugins.def.
# In the GN build, we instead have an explicit list of all plugins here.
# Every entry in this list is a (GN target, LLDB_PLUGIN Plugins.def name) pair.
lldb_plugins = []
if (llvm_build_X86) {
  lldb_plugins += [ [
        "//lldb/source/Plugins/ABI/X86",
        "ABIX86",
      ] ]
}
lldb_plugins += [
  [
    "//lldb/source/Plugins/Architecture/PPC64",
    "ArchitecturePPC64",
  ],
  [
    "//lldb/source/Plugins/Disassembler/LLVMC",
    "DisassemblerLLVMC",
  ],
  [
    "//lldb/source/Plugins/DynamicLoader/Darwin-Kernel",
    "DynamicLoaderDarwinKernel",
  ],
  [
    "//lldb/source/Plugins/DynamicLoader/MacOSX-DYLD",
    "DynamicLoaderMacOSXDYLD",
  ],
  [
    "//lldb/source/Plugins/DynamicLoader/POSIX-DYLD",
    "DynamicLoaderPosixDYLD",
  ],
  [
    "//lldb/source/Plugins/DynamicLoader/Static",
    "DynamicLoaderStatic",
  ],
  [
    "//lldb/source/Plugins/DynamicLoader/Windows-DYLD",
    "DynamicLoaderWindowsDYLD",
  ],
  [
    "//lldb/source/Plugins/Instruction/ARM",
    "InstructionARM",
  ],
  [
    "//lldb/source/Plugins/JITLoader/GDB",
    "JITLoaderGDB",
  ],
  [
    "//lldb/source/Plugins/Language/CPlusPlus",
    "CPlusPlusLanguage",
  ],
  [
    "//lldb/source/Plugins/Language/ObjC",
    "ObjCLanguage",
  ],
  [
    "//lldb/source/Plugins/Language/ObjCPlusPlus",
    "ObjCPlusPlusLanguage",
  ],
  [
    "//lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI",
    "CXXItaniumABI",
  ],
  [
    "//lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime",
    "AppleObjCRuntime",
  ],
  [
    "//lldb/source/Plugins/ObjectContainer/BSD-Archive",
    "ObjectContainerBSDArchive",
  ],
  [
    "//lldb/source/Plugins/ObjectContainer/Universal-Mach-O",
    "ObjectContainerMachOArchive",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/Breakpad",
    "ObjectFileBreakpad",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/ELF",
    "ObjectFileELF",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/Mach-O",
    "ObjectFileMachO",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/PDB",
    "ObjectFilePDB",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/PECOFF",
    "ObjectFilePECOFF",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/Placeholder",
    "ObjectFilePlaceholder",
  ],
  [
    "//lldb/source/Plugins/ObjectFile/wasm",
    "ObjectFileWasm",
  ],
  [
    "//lldb/source/Plugins/Platform/Linux",
    "PlatformLinux",
  ],
  [
    "//lldb/source/Plugins/Platform/MacOSX",
    "PlatformMacOSX",
  ],
  [
    "//lldb/source/Plugins/Platform/Windows",
    "PlatformWindows",
  ],
  [
    "//lldb/source/Plugins/Process/elf-core",
    "ProcessElfCore",
  ],
  [
    "//lldb/source/Plugins/Process/gdb-remote",
    "",  # Uses LLDB_PROCESS_GDB_PLUGIN instead.
  ],
  [
    "//lldb/source/Plugins/Process/mach-core",
    "ProcessMachCore",
  ],
  [
    "//lldb/source/Plugins/Process/minidump",
    "ProcessMinidump",
  ],
  [
    "//lldb/source/Plugins/REPL/Clang",
    "ClangREPL",
  ],
  [
    "//lldb/source/Plugins/ScriptInterpreter/None",
    "",  # Uses LLDB_SCRIPT_PLUGIN instead.
  ],
  [
    "//lldb/source/Plugins/SymbolFile/Breakpad",
    "SymbolFileBreakpad",
  ],
  [
    "//lldb/source/Plugins/SymbolFile/DWARF",
    "SymbolFileDWARF",
  ],
  [
    "//lldb/source/Plugins/SymbolFile/PDB",
    "SymbolFilePDB",
  ],
  [
    "//lldb/source/Plugins/SymbolFile/Symtab",
    "SymbolFileSymtab",
  ],
]
if (current_os == "mac") {
  lldb_plugins += [ [
        "//lldb/source/Plugins/SymbolVendor/MacOSX",
        "SymbolVendorMacOSX",
      ] ]
}
lldb_plugins += [
  [
    "//lldb/source/Plugins/SymbolVendor/ELF",
    "SymbolVendorELF",
  ],

  [
    "//lldb/source/Plugins/SymbolVendor/wasm",
    "SymbolVendorWasm",
  ],

  [
    "//lldb/source/Plugins/SymbolVendor/PECOFF",
    "SymbolVendorPECOFF",
  ],

  [
    "//lldb/source/Plugins/TypeSystem/Clang",
    "TypeSystemClang",
  ],

  [
    "//lldb/source/Plugins/UnwindAssembly/InstEmulation",
    "UnwindAssemblyInstEmulation",
  ],
  [
    "//lldb/source/Plugins/UnwindAssembly/x86",
    "UnwindAssemblyX86",
  ],
]

write_cmake_config("Plugins.def") {
  input = "Plugins.def.in"
  output = "$target_gen_dir/Plugins.def"

  enum_plugins = ""
  foreach(plugin, lldb_plugins) {
    plugin_id = plugin[1]
    if (plugin_id != "") {
      # \n is a literal '\' followed by a literal 'n', not a newline character.
      # write_cmake_config.py replaces it with a real newline.
      enum_plugins += "LLDB_PLUGIN(" + plugin_id + ")\n"
    }
  }

  deps = [ "//lldb/source/Plugins/ScriptInterpreter/None" ]
  enum_plugins += "LLDB_SCRIPT_PLUGIN(ScriptInterpreterNone)"

  values = [ "LLDB_ENUM_PLUGINS=" + enum_plugins ]

  # These are in separate variables to make sure ProcessWindowsCommon is
  # initalized after all plugins, but before ProcessGDBRemote.
  if (current_os == "win") {
    values +=
        [ "LLDB_PROCESS_WINDOWS_PLUGIN=LLDB_PLUGIN(ProcessWindowsCommon)" ]
  } else {
    values += [ "LLDB_PROCESS_WINDOWS_PLUGIN=" ]
  }
  values += [ "LLDB_PROCESS_GDB_PLUGIN=LLDB_PLUGIN(ProcessGDBRemote)" ]
}

config("AllLldbPlugins_config") {
  visibility = [ ":LldbAllPlugins" ]

  # To pick up Plugins.def.
  include_dirs = [ "$root_gen_dir/lldb/source" ]
}

group("LldbAllPlugins") {
  deps = [ ":Plugins.def" ]
  foreach(plugin, lldb_plugins) {
    deps += [ plugin[0] ]
  }
  public_configs = [ ":AllLldbPlugins_config" ]
}
